#include<stdio.h>
#include<malloc.h>
#define Maxsize 100
//递归算法
void Hanoi1(int n,char a,char b,char c)
{
    if (n==1)
        printf("%\t将第%d个盘子从%c移到%c\n",n,a,c);
        else
        {
		    Hanoi1(n-1,a,b,c)
            printf("%\t将第%d个盘子从%c移到%c\n",n,a,b);
            Hanoil(n-1,b,a,c); 
	    }
}
//非递归算法
typedef struct
{
	int n;
	char x,y,z;
	bool flag;
 } ElemType;
 typedef struct
 {
 	ElemType[Maxsize];
 	int top;
 }StackType;
 //--求解Hanoi1问题对应顺序栈的基本运算算法----
 void InitStack(StackType *&s) 
 {
 	s=(StackType*)malloc(sizeof(StackType));
 	s->top=-1;
 }
 void DestoryStack(StackType *s)
 {
 	free(s);
 }
 bool StackEmpty(StackType *s)
 {
 	return (s->top==-1);
 }
 void PushStack(StackType *&s,ElemType e)
 {
 	if(s->top==Maxszie-1)
        return false
        s->top++
        e=s->data[s->top];
        return true;
 }
void PopStack(StackType *&s,ElemType &e)
 {
 	if (s->top==-1)
 	return false;
    e=s->data[s->top];
    s->top--;
    return true;
}
void Hanoi2(int n, char x, char y, char z)
{
	StackType *st;							
	ElemType e, e1, e2, e3;
	if (n <= 0) return;						
	InitStack(st);							
	e.n = n; e.x = x; e.y = y; e.z = z; e.flag = false;
    PushStack(st,e); 
	while (!StackEmpty(st))					
	{
        PopStack(st,e);		
		if (e.flag == false)				
		{
			e1.n = e.n - 1; e1.x = e.y; e1.y = e.x; e1.z = e.z;
			if (e1.n == 1)					
				e1.flag = true;
			else							
				e1.flag = false;
		PushStack(st, e1);					
			e2.n = e.n; e2.x = e.x; e2.y = e.y; e2.z = e.z; e2.flag = true;
				Push(st,e2);			
			e3.n = e.n - 1; e3.x = e.x; e3.y = e.z; e3.z = e.y;
			if (e3.n == 1)					
				e3.flag = true;
			else
				e3.flag = false;			
				PushStack(st,e3);			
		}
		else								
			printf("\t将第%d个盘片从%c移动到%c\n", e.n, e.x, e.z);
	}DestroyStack(st);						
}
int main()
{
    int n=3;
    printf("递归算法： %d个盘片移动过程：\n",n)
    Hanoi1(n,'X','Y','Z');
    printf("非递归算法： %d个盘片移动过程：\n",n)
    Hanoi2(n,'X','Y','Z');
    return 1;
}

 }